package com.study.service.impl;

import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.study.pojo.User;
import com.study.service.UserService;
import com.study.mapper.UserMapper;
import com.study.utils.JwtHelper;
import com.study.utils.MD5Util;
import com.study.utils.Result;
import com.study.utils.ResultCodeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
* @author 路明非
* @description 针对表【news_user】的数据库操作Service实现
* @createDate 2025-02-28 18:21:46
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
    implements UserService{
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private JwtHelper jwtHelper;

    /**
     * 登录业务
     * 1.根据账号查询用户对象
     * 2.查询失败则返回501
     * 3.校验密码 失败返回503
     * 4.根据id返回一个token，由token返回给前端
     * @param user
     * @return
     */
    @Override
    public Result login(User user) {
       // 1.根据账号查询用户对象
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getUsername,user.getUsername());
        User loginUser = userMapper.selectOne(lambdaQueryWrapper);
        if (loginUser==null){
            return Result.build(null, ResultCodeEnum.USERNAME_ERROR);
        }
        // 2.校验密码
       /* if (!loginUser.getUserPwd().equals(user.getUserPwd())&&!StringUtils.isEmpty(user.getUserPwd())){
            //登录成功，根据id返回一个token，由token返回给前端
            String token = jwtHelper.createToken(Long.valueOf(loginUser.getUid()));
            HashMap data = new HashMap<>();
            data.put("token",token);
            return Result.ok(data);
        }*/
        /**
         * 密码不为空，使用MD5加密后的密码进行校验
         */
        if(!StringUtils.isEmpty(user.getUserPwd())&& MD5Util.encrypt(user.getUserPwd()).equals(loginUser.getUserPwd())){
            //登录成功，根据id返回一个token，由token返回给前端
            String token = jwtHelper.createToken(Long.valueOf(loginUser.getUid()));
            HashMap data = new HashMap<>();
            data.put("token",token);
            return Result.ok(data);
        }
        //密码错误
        return Result.build(null, ResultCodeEnum.PASSWORD_ERROR);

    }

    /**
     * 根据token获取用户信息
     * 1.token是否在有效期
     * 2.根据token解析的id
     * 3.根据id查询用户信息
     * 4.去掉密码，封装result结果返回给前端（返回给前端时将其制空null）
     * @param token
     * @return
     */

    @Override
    public Result getUserInfo(String token) {
        // 1.token是否在有效期 true：过期，false：不过期
        boolean expiration = jwtHelper.isExpiration(token);
        if (expiration){
            //token过期
            return Result.build(null, ResultCodeEnum.NOTLOGIN);
        }
        // 2.根据token解析的id
        int userId = jwtHelper.getUserId(token).intValue();
        //3.根据id查询用户信息
        User loginUser = userMapper.selectById(userId);
        loginUser.setUserPwd(null);
        //4.封装result结果返回给前端（返回给前端时将其制空null）
        HashMap data = new HashMap<>();
        data.put("loginUser",loginUser);
        return Result.ok(data);
    }

    /**
     * 检查账号(用户名)是否存在（可用）
     * 1.根据账号进行count查询
     * 2.如果不等0，则账号存在，返回false，账号可用，返回true
     * @param username
     * @return
     */

    @Override
    public Result checkUserName(String username) {
        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
        userLambdaQueryWrapper.eq(User::getUsername,username);
        long count = userMapper.selectCount(userLambdaQueryWrapper);
        if (count==0){
            return Result.ok(null);

        }
        return Result.build(null,ResultCodeEnum.USERNAME_USED);
    }

    /**
     * 注册业务
     * 1.检查账号是否可用
     * 2.密码加密
     * 3.保存用户信息
     * 4.返回结果
     * @param user
     * @return
     */
    @Override
    public Result regist(User user) {
        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
        userLambdaQueryWrapper.eq(User::getUsername,user.getUsername());
        long count = userMapper.selectCount(userLambdaQueryWrapper);
        if (count>0){
            return Result.build(null,ResultCodeEnum.USERNAME_USED);
        }
        // 密码加密
        user.setUserPwd(MD5Util.encrypt(user.getUserPwd()));
        // 保存用户信息
        userMapper.insert(user);
        return Result.ok(null);
    }

    @Override
    public Result checkLogin(String token) {
        boolean expiration = jwtHelper.isExpiration(token);
        // 1.token是否在有效期 true：过期，false：不过期
        if (expiration){
            //token过期
            return Result.build(null, ResultCodeEnum.NOTLOGIN);
        }
        return Result.ok(null);
    }
}




